package com.base.proxy.jdk.demo;


import com.base.proxy.jdk.demo.proxy.ZtoExpressProxy;
import com.base.proxy.jdk.demo.service.ExpressService;
import com.base.proxy.jdk.demo.service.impl.CustomerImpl;
import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;
import java.lang.reflect.Proxy;

/**
 * Created by xingyuchao on 2017-06-13.
 * 动态代理测试类
 */
public class Main {

    public static void main(String[] args) throws  Exception{

        //需求：实现快递公司和客户之间动态代理

        //原理：
        //1.拿到被代理对象的引用，然后获取它的接口
        //2.JDK代理重新生成一个类$proxy0,同时实现我们给要代理的对象实现的接口，并且继承Proxy(创建动态代理类)
        //3.把被代理对象的引用也拿到了
        //4.重新动态生成一个class字节码
        //5.然后编译

        
        ExpressService target = new CustomerImpl();

        ExpressService proxy = (ExpressService) new ZtoExpressProxy().getZtoExpressProxy(target);

        System.out.println(proxy.getClass());  //class com.sun.proxy.$Proxy0  JDK生成的动态代理类

        proxy.sendExpress();

        //获取字节码内容
        byte[] data = ProxyGenerator.generateProxyClass("$Proxy0",new Class[]{ExpressService.class});

        FileOutputStream fos = new FileOutputStream("E:\\workspace4\\zto-designPattern\\$Proxy0.class");
        fos.write(data);
        fos.close();
    }
}
